﻿using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MonopolyNOHI2015;

namespace MonopolyTests
{
    [TestClass]
    public class SpelerTests
    {
        private Speler _spelerHerman;
        private Speler _spelerRandy;
        private Eigendomsbewijs _eigendomsbewijs;
        private StraatVeld _straatVeld;
        private Bord _monopolybord;

        [TestInitialize]
        public void Setup()
        {
            _monopolybord = new Bord();
            _spelerHerman = new Speler("Herman", 850, _monopolybord);
            _spelerRandy = new Speler("Randy", 850, _monopolybord);
            _straatVeld = new StraatVeld(3, "Brink", "Ons Dorp",0,0);
            _eigendomsbewijs = new EigendomsbewijsStraat(null, _straatVeld, 60, 4, 20, 60, 180, 320, 450);
        }

        [TestMethod]
        public void TestOfSpelerNaamHermanIs()
        {
            Assert.AreEqual(expected: "Herman", actual: _spelerHerman.GetNaam());
        }

        [TestMethod]
        public void TestOfSpelerNaamRandyIs()
        {
            Assert.AreEqual(expected: "Randy", actual: _spelerRandy.GetNaam());
        }

        [TestMethod]
        public void TestOfSpelerStartBedrag850Is()
        {
            Assert.AreEqual(expected: 850, actual: _spelerHerman.GetSaldo());
        }

        [TestMethod]
        public void TestOfBedrag750IsNaBetalingVan100()
        {
            _spelerHerman.BetaalBedrag(100);
            Assert.AreEqual(expected: 750, actual: _spelerHerman.GetSaldo());
        }

        [TestMethod]
        public void TestOfBedrag0IsNaBetalingVan850()
        {
            _spelerRandy.BetaalBedrag(850);
            Assert.AreEqual(expected: 0, actual: _spelerRandy.GetSaldo());
        }

        [TestMethod]
        public void TestOfBedrag950IsNaOntvangenBedragVan100()
        {
            _spelerHerman.OntvangBedrag(100);
            Assert.AreEqual(expected: 950, actual: _spelerHerman.GetSaldo());
        }

        [TestMethod]
        public void TestOfBedrag2300IsNaOntvangenBedragVan1450()
        {
            _spelerRandy.OntvangBedrag(1450);
            Assert.AreEqual(expected: 2300, actual: _spelerRandy.GetSaldo());
        }

        [TestMethod]
        public void TestOfVerzetPionNaarVeld10GaatEnVeldVanPionOpgevraagdWordt()
        {
            _spelerHerman.VerzetPion(10);
            Assert.AreEqual(expected: "Gevangenis", actual: _spelerHerman.GetPionVeld().GetVeldNaam());
        }

        [TestMethod]
        public void TestOfLangsStartGekomenWordtOpgemerktBijVerzettenVanPionAanHetEindeVanHetBord()
        {
            _spelerHerman.VerzetPion(38);
            _spelerHerman.VerzetPion(2);
            Assert.AreEqual(expected: true, actual: _spelerHerman.LangsStartGekomen);
        }

        [TestMethod]
        public void TestOfKoopbedragVan60EuroAfgeschrevenWordtBijKopenVanEigendomsbewijs()
        {
            _spelerHerman.VerzetPion(3);
            _spelerHerman.KoopEigendomsbewijs(_eigendomsbewijs);
            Assert.AreEqual(expected: 790, actual: _spelerHerman.GetSaldo());
        }

        [TestMethod]
        public void ControleerOfSpelerNaarDeGevangenisGestuurdWordtEnVervolgensWeerOntsnapt()
        {
            // Eerst Herman in de gevangenis zetten
            _spelerHerman.GaDirectNaarDeGevangenis(_monopolybord.Velden[10]);
            // Controleer of Herman daadwerkelijk in de gevangenis zit.
            Assert.AreEqual(expected: true, actual: _spelerHerman.GetPion().GetGevangenSatus());

            // Dan Herman weer uit de gevangenis laten ontsnappen
            _spelerHerman.OntsnapUitDeGevangenis(5);
            Assert.AreEqual(expected: false, actual: _spelerHerman.GetPion().GetGevangenSatus());
        }
    }
}
